package com.umfwechat.common.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver;
import org.springframework.web.servlet.mvc.multiaction.MethodNameResolver;
/**
 * desc:拦截器
 * <p>创建人：xuhuanchao 创建日期：2016-11-8 </p>
 * @version V1.0
 */
public class CommonInterceptor extends HandlerInterceptorAdapter{
	
	private final Logger logger = LoggerFactory.getLogger(CommonInterceptor.class);

	/**
	 * desc: 打印耗时统计日志
	 *  在业务处理器处理请求之前被调用 如果返回false 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
	 * 如果返回true 执行下一个拦截器,直到所有的拦截器都执行完毕 再执行被拦截的Controller 然后进入拦截器链,
	 * 从最后一个拦截器往回执行所有的postHandle() 接着再从最后一个拦截器往回执行所有的afterCompletion()
	 * <p>创建人：xuhuanchao , 创建日期：2016-11-8</p>
	 * @param request
	 * @param response
	 * @param handler
	 * @return
	 */
	public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
		//得到开始时间，以便耗时日志打印 
		long startTime = System.currentTimeMillis();  
	     request.setAttribute("startTime", startTime);  
	     return true; 
	}
	
	
	
	
	/**
	 * desc: 打印耗时统计日志
	 * 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。postHandle是进行处理器拦截用的，它的执行时间是在处理器进行处理之后，
	 * 也就是在Controller的方法调用之后执行，但是它会在DispatcherServlet进行视图的渲染之前执行，也就是说在这个方法中你可以对ModelAndView进行操作。
	 * <p>创建人：xuhuanchao , 创建日期：2016-11-8</p>
	 * @param request
	 * @param response
	 * @param handler
	 * @return
	 */
    @Override    
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {    
    	
		long startTime = (Long) request.getAttribute("startTime");				//开始时间
		long executeTime = System.currentTimeMillis() - startTime;				//执行方法耗时
		MethodNameResolver methodNameResolver = new InternalPathMethodNameResolver();
		String methodName=methodNameResolver.getHandlerMethodName(request);		//方法名
		//把handler对象转换为HandlerMethod类型
		HandlerMethod handlerMethod = (HandlerMethod) handler;
		
		//beanName：得到类名；class com.umpay.spapply.web.controller.MerProductController
		String beanName = handlerMethod.getBeanType().toString();
		String[] beanType=beanName.split(" ");
		if(beanType.length>1){
			beanName=beanType[1];
		}		
		logger.info("耗时日志打印：" +beanName + "|"+ methodName + "|" + executeTime);//耗时日志打印：类名|方法名|所用时间
//		System.out.println("耗时日志打印：" +beanName + "|"+ methodName + "|" + executeTime);//耗时日志打印：类名|方法名|所用时间
    }    
    
}
